package com.yadang.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Component;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;

import java.util.List;

/**
 * @author: 亚当
 * @date: 2023年04月26日 20:48
 * @package: com.yadang.service
 * @Description: TODO
 */

/**
 * 我们定义了一个名为BatchMessageListener的组件，该组件使用@JmsListener注解监听myQueue队列。该方法的参数类型为List<String>，表示该方法将一次性接收并处理多条消息。
 *
 * 在方法内部，我们首先通过PlatformTransactionManager获取一个事务，并使用TransactionStatus对象来跟踪事务的状态。然后，我们遍历消息列表，逐个处理每一条消息。如果某条消息处理失败，我们将抛出异常，导致事务回滚并结束当前方法的执行。否则，如果所有消息处理成功，则提交事务，表示整个批量消息的处理过程已经完成。
 *
 * 需要注意的是，如果使用ActiveMQ的事务机制，消息监听器容器将在事务的范围内处理接收到的消息。如果事务提交成功，则表示所有消息都已经被成功消费，否则将回滚事务，表示所有消息都没有被成功消费。这种方式可以保证消息的一致性和可靠性，但也可能会对系统的吞吐量和性能造成一定的影响。因此，在实际应用中，需要根据具体的业务需求和系统性能指标来进行权衡和选择。
 */
@Component
public class BatchMessageListener {

    @Autowired
    private JmsTemplate jmsTemplate;

    @Autowired
    private PlatformTransactionManager transactionManager;

    @JmsListener(destination = "myQueue")
    public void processMessages(List<String> messages) {
        DefaultTransactionDefinition def = new DefaultTransactionDefinition();
        def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
        TransactionStatus status = transactionManager.getTransaction(def);
        try {
            for (String message : messages) {
                System.out.println(message);
                // 处理消息的逻辑
                // 如果消息处理失败，抛出异常
            }
            // 如果所有消息处理成功，则提交事务
            transactionManager.commit(status);
        } catch (Exception ex) {
            // 如果出现异常，则回滚事务
            transactionManager.rollback(status);
            throw ex;
        }
    }
}
